home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Tcl-Tk 8.0 / Pre-installed version / tcl8.0 / tests / fCmd.test < prev    next >
Encoding:
Text File  |  1997-08-15  |  63.9 KB  |  2,087 lines  |  [TEXT/ALFA]

  1. # This file tests the tclFCmd.c file.
  2. #
  3. # This file contains a collection of tests for one or more of the Tcl
  4. # built-in commands.  Sourcing this file into Tcl runs the tests and
  5. # generates output for errors.  No output means no errors were found.
  6. #
  7. # Copyright (c) 1996-1997 Sun Microsystems, Inc.
  8. #
  9. # See the file "license.terms" for information on usage and redistribution
  10. # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  11. #
  12. # SCCS: @(#) fCmd.test 1.31 97/08/05 11:42:09
  13. #
  14.  
  15. if {[string compare test [info procs test]] == 1} then {source defs}
  16.  
  17. set platform [testgetplatform]
  18.  
  19. if {$user == "root"} {
  20.     puts "Skipping fCmd tests.  They depend on not being able to write to"
  21.     puts "certain directories.  It would be too dangerous to run them as root."
  22.     return
  23. }
  24.  
  25. if {"[info commands testchmod]" != "testchmod"} {
  26.     puts "Skipping fCmd tests. This application does not seem to have the"
  27.     puts "testchmod command that is needed to run these tests."
  28.     return
  29. }
  30.  
  31. proc createfile {file {string a}} {
  32.     set f [open $file w]
  33.     puts -nonewline $f $string
  34.     close $f
  35.     return $string
  36. }
  37.  
  38. # checkcontent --
  39. #
  40. #  Ensures that file "file" contains only the string "matchString"
  41. #  returns 0 if the file does not exist, or has a different content
  42. #
  43. proc checkcontent {file matchString} {
  44.     if {[catch {
  45.     set f [open $file]
  46.     set fileString [read $f]
  47.     close $f 
  48.     }]} {
  49.     return 0
  50.     }
  51.     return [string match $matchString $fileString]
  52. }
  53.  
  54. proc openup {path} {
  55.     testchmod 777 $path
  56.     if {[file isdirectory $path]} {
  57.     catch {
  58.         foreach p [glob [file join $path *]] {
  59.         openup $p
  60.         }
  61.     }
  62.     }
  63. }
  64.  
  65. proc cleanup {args} {
  66.     foreach p ". $args" {
  67.     set x ""
  68.     catch {
  69.         set x [glob [file join $p tf*] [file join $p td*]]
  70.     }
  71.     foreach file $x {
  72.         if {[catch {file delete -force -- $file}]} {
  73.         openup $file
  74.         file delete -force -- $file
  75.         }
  76.     }
  77.     }
  78. }
  79.  
  80. proc contents {file} {
  81.     set f [open $file r]
  82.     set r [read $f]
  83.     close $f
  84.     set r
  85. }
  86.  
  87. set testConfig(NT) 0
  88. set testConfig(95) 0
  89.  
  90. switch $tcl_platform(os) {
  91.     "Windows NT" {set testConfig(NT) 1}
  92.     "Windows 95" {set testConfig(95) 1}
  93. }
  94.  
  95. set testConfig(fileSharing) 0
  96. set testConfig(notFileSharing) 1
  97.  
  98. if {$tcl_platform(platform) == "macintosh"} {
  99.     catch {file delete -force foo.dir}
  100.     file mkdir foo.dir
  101.     if {[catch {file attributes foo.dir -readonly 1}] == 0} {
  102.         set testConfig(fileSharing) 1
  103.         set testConfig(notFileSharing) 0
  104.     }
  105.     file delete -force foo.dir
  106. }
  107.  
  108. set testConfig(xdev) 0
  109.  
  110. if {$tcl_platform(platform) == "unix"} {
  111.     if {[catch {set m1 [exec df .]; set m2 [exec df /tmp]}] == 0} {
  112.     set m1 [string range $m1 0 [expr [string first " " $m1]-1]]
  113.     set m2 [string range $m2 0 [expr [string first " " $m2]-1]]
  114.     if {$m1 != "" && $m2 != "" && $m1 != $m2 && [file exists $m1] && [file exists $m2]} {
  115.         set testConfig(xdev) 1
  116.     }
  117.     }
  118. }
  119.  
  120. set root [lindex [file split [pwd]] 0]
  121.  
  122. # A really long file name
  123. # length of long is 1216 chars, which should be greater than any static
  124. # buffer or allowable filename.
  125.  
  126. set long "abcdefghihjllmnopqrstuvwxyz01234567890"
  127. append long $long
  128. append long $long
  129. append long $long
  130. append long $long
  131. append long $long
  132.  
  133. test fCmd-1.1 {TclFileRenameCmd} {
  134.     cleanup
  135.     createfile tf1
  136.     file rename tf1 tf2
  137.     glob tf*
  138. } {tf2}
  139.  
  140. test fCmd-2.1 {TclFileCopyCmd} {
  141.     cleanup
  142.     createfile tf1
  143.     file copy tf1 tf2
  144.     lsort [glob tf*]
  145. } {tf1 tf2}
  146.  
  147. test fCmd-3.1 {FileCopyRename: FileForceOption fails} {
  148.     list [catch {file rename -xyz} msg] $msg
  149. } {1 {bad option "-xyz": should be -force or --}}
  150. test fCmd-3.2 {FileCopyRename: not enough args} {
  151.     list [catch {file rename xyz} msg] $msg
  152. } {1 {wrong # args: should be "file rename ?options? source ?source ...? target"}}
  153. test fCmd-3.3 {FileCopyRename: Tcl_TranslateFileName fails} {
  154.     list [catch {file rename xyz ~nonexistantuser} msg] $msg
  155. } {1 {user "nonexistantuser" doesn't exist}}
  156. test fCmd-3.4 {FileCopyRename: Tcl_TranslateFileName passes} {
  157.     cleanup
  158.     list [catch {file copy tf1 ~} msg] $msg
  159. } {1 {error copying "tf1": no such file or directory}}
  160. test fCmd-3.5 {FileCopyRename: target doesn't exist: stat(target) != 0} {
  161.     cleanup
  162.     list [catch {file rename tf1 tf2 tf3} msg] $msg
  163. } {1 {error renaming: target "tf3" is not a directory}}
  164. test fCmd-3.6 {FileCopyRename: target tf3 is not a directory: !S_ISDIR(target)} {
  165.     cleanup
  166.     createfile tf3
  167.     list [catch {file rename tf1 tf2 tf3} msg] $msg
  168. } {1 {error renaming: target "tf3" is not a directory}}
  169. test fCmd-3.7 {FileCopyRename: target exists & is directory} {
  170.     cleanup
  171.     file mkdir td1
  172.     createfile tf1 tf1
  173.     file rename tf1 td1
  174.     contents [file join td1 tf1]
  175. } {tf1}
  176. test fCmd-3.8 {FileCopyRename: too many arguments: argc - i > 2} {
  177.     cleanup
  178.     list [catch {file rename tf1 tf2 tf3} msg] $msg
  179. } {1 {error renaming: target "tf3" is not a directory}}
  180. test fCmd-3.9 {FileCopyRename: too many arguments: argc - i > 2} {
  181.     cleanup
  182.     list [catch {file copy -force -- tf1 tf2 tf3} msg] $msg
  183. } {1 {error copying: target "tf3" is not a directory}}
  184. test fCmd-3.10 {FileCopyRename: just 2 arguments} {
  185.     cleanup
  186.     createfile tf1 tf1
  187.     file rename tf1 tf2
  188.     contents tf2
  189. } {tf1}
  190. test fCmd-3.11 {FileCopyRename: just 2 arguments} {
  191.     cleanup
  192.     createfile tf1 tf1
  193.     file rename -force -force -- tf1 tf2
  194.     contents tf2
  195. } {tf1}
  196. test fCmd-3.12 {FileCopyRename: move each source: 1 source} {
  197.     cleanup
  198.     createfile tf1 tf1
  199.     file mkdir td1
  200.     file rename tf1 td1
  201.     contents [file join td1 tf1]
  202. } {tf1}
  203. test fCmd-3.13 {FileCopyRename: move each source: multiple sources} {
  204.     cleanup
  205.     createfile tf1 tf1
  206.     createfile tf2 tf2
  207.     createfile tf3 tf3
  208.     createfile tf4 tf4
  209.     file mkdir td1
  210.     file rename tf1 tf2 tf3 tf4 td1
  211.     list [contents [file join td1 tf1]] [contents [file join td1 tf2]] \
  212.     [contents [file join td1 tf3]] [contents [file join td1 tf4]]
  213. } {tf1 tf2 tf3 tf4}
  214. test fCmd-3.14 {FileCopyRename: FileBasename fails} {
  215.     cleanup
  216.     file mkdir td1
  217.     list [catch {file rename ~nonexistantuser td1} msg] $msg
  218. } {1 {user "nonexistantuser" doesn't exist}}
  219. test fCmd-3.15 {FileCopyRename: source[0] == '\0'} {unixOrPc} {
  220.     cleanup
  221.     file mkdir td1
  222.     list [catch {file rename / td1} msg] $msg
  223. } {1 {error renaming "/" to "td1": file already exists}}
  224. test fCmd-3.16 {FileCopyRename: break on first error} {
  225.     cleanup
  226.     createfile tf1 
  227.     createfile tf2 
  228.     createfile tf3 
  229.     createfile tf4 
  230.     file mkdir td1
  231.     createfile [file join td1 tf3]
  232.     list [catch {file rename tf1 tf2 tf3 tf4 td1} msg] $msg
  233. } [subst {1 {error renaming "tf3" to "[file join td1 tf3]": file already exists}}]
  234.  
  235. test fCmd-4.1 {TclFileMakeDirsCmd: make each dir: 1 dir} {
  236.     cleanup
  237.     file mkdir td1
  238.     glob td*
  239. } {td1}
  240. test fCmd-4.2 {TclFileMakeDirsCmd: make each dir: multiple dirs} {
  241.     cleanup
  242.     file mkdir td1 td2 td3
  243.     lsort [glob td*]
  244. } {td1 td2 td3}
  245. test fCmd-4.3 {TclFileMakeDirsCmd: stops on first error} {
  246.     cleanup
  247.     createfile tf1
  248.     catch {file mkdir td1 td2 tf1 td3 td4}
  249.     glob td1 td2 tf1 td3 td4
  250. } {td1 td2 tf1}
  251. test fCmd-4.4 {TclFileMakeDirsCmd: Tcl_TranslateFileName fails} {
  252.     cleanup
  253.     list [catch {file mkdir ~nonexistantuser} msg] $msg
  254. } {1 {user "nonexistantuser" doesn't exist}}
  255. test fCmd-4.5 {TclFileMakeDirsCmd: Tcl_SplitPath returns 0: *name == '\0'} {
  256.     cleanup
  257.     list [catch {file mkdir ""} msg] $msg
  258. } {1 {can't create directory "": no such file or directory}}
  259. test fCmd-4.6 {TclFileMakeDirsCmd: one level deep} {
  260.     cleanup
  261.     file mkdir td1
  262.     glob td1
  263. } {td1}
  264. test fCmd-4.7 {TclFileMakeDirsCmd: multi levels deep} {
  265.     cleanup
  266.     file mkdir [file join td1 td2 td3 td4]
  267.     glob td1 [file join td1 td2]
  268. } "td1 [file join td1 td2]"
  269. test fCmd-4.8 {TclFileMakeDirsCmd: already exist: lstat(target) == 0} {
  270.     cleanup
  271.     file mkdir td1
  272.     set x [file exist td1]
  273.     file mkdir td1
  274.     list $x [file exist td1]
  275. } {1 1}
  276. test fCmd-4.9 {TclFileMakeDirsCmd: exists, not dir} {
  277.     cleanup
  278.     createfile tf1
  279.     list [catch {file mkdir tf1} msg] $msg
  280. } [subst {1 {can't create directory "[file join tf1]": file already exists}}]
  281. test fCmd-4.10 {TclFileMakeDirsCmd: exists, is dir} {
  282.     cleanup
  283.     file mkdir td1
  284.     set x [file exist td1]
  285.     file mkdir td1
  286.     list $x [file exist td1]
  287. } {1 1}
  288. test fCmd-4.11 {TclFileMakeDirsCmd: doesn't exist: errno != ENOENT} {unixOnly} {
  289.     cleanup
  290.     file mkdir td1/td2/td3
  291.     testchmod 000 td1/td2
  292.     set msg [list [catch {file mkdir td1/td2/td3/td4} msg] $msg]
  293.     testchmod 755 td1/td2
  294.     set msg
  295. } {1 {can't create directory "td1/td2/td3": permission denied}}
  296. test fCmd-4.12 {TclFileMakeDirsCmd: doesn't exist: errno != ENOENT} {macOnly} {
  297.     cleanup
  298.     list [catch {file mkdir nonexistantvolume:} msg] $msg
  299. } {1 {can't create directory "nonexistantvolume:": invalid argument}}
  300. test fCmd-4.13 {TclFileMakeDirsCmd: doesn't exist: errno == ENOENT} {
  301.     cleanup
  302.     set x [file exist td1]
  303.     file mkdir td1
  304.     list $x [file exist td1]
  305. } {0 1}
  306. test fCmd-4.14 {TclFileMakeDirsCmd: TclpCreateDirectory fails} {unixOnly nonPortable} {
  307.     cleanup
  308.     list [catch {file mkdir /tf1} msg] $msg
  309. } {1 {can't create directory "/tf1": permission denied}}
  310. test fCmd-4.15 {TclFileMakeDirsCmd: TclpCreateDirectory fails} {macOnly} {
  311.     list [catch {file mkdir ${root}:} msg] $msg
  312. } [subst {1 {can't create directory "${root}:": no such file or directory}}]
  313. test fCmd-4.16 {TclFileMakeDirsCmd: TclpCreateDirectory succeeds} {
  314.     cleanup
  315.     file mkdir tf1
  316.     file exists tf1
  317. } {1}
  318.  
  319. test fCmd-5.1 {TclFileDeleteCmd: FileForceOption fails} {
  320.     list [catch {file delete -xyz} msg] $msg
  321. } {1 {bad option "-xyz": should be -force or --}}
  322. test fCmd-5.2 {TclFileDeleteCmd: not enough args} {
  323.     list [catch {file delete -force -force} msg] $msg
  324. } {1 {wrong # args: should be "file delete ?options? file ?file ...?"}}
  325. test fCmd-5.3 {TclFileDeleteCmd: 1 file} {
  326.     cleanup
  327.     createfile tf1
  328.     createfile tf2
  329.     file mkdir td1
  330.     file delete tf2
  331.     glob tf* td*
  332. } {tf1 td1}
  333. test fCmd-5.4 {TclFileDeleteCmd: multiple files} {
  334.     cleanup
  335.     createfile tf1
  336.     createfile tf2
  337.     file mkdir td1
  338.     set x [list [file exist tf1] [file exist tf2] [file exist td1]]
  339.     file delete tf1 td1 tf2
  340.     lappend x [file exist tf1] [file exist tf2] [file exist tf3]
  341. } {1 1 1 0 0 0}
  342. test fCmd-5.5 {TclFileDeleteCmd: stop at first error} {unixOrPc} {
  343.     cleanup
  344.     createfile tf1
  345.     createfile tf2
  346.     file mkdir td1
  347.     catch {file delete tf1 td1 $root tf2}
  348.     list [file exist tf1] [file exist tf2] [file exist td1]
  349. } {0 1 0}
  350. test fCmd-5.6 {TclFileDeleteCmd: Tcl_TranslateFileName fails} {
  351.     list [catch {file delete ~nonexistantuser} msg] $msg
  352. } {1 {user "nonexistantuser" doesn't exist}}
  353. test fCmd-5.7 {TclFileDeleteCmd: Tcl_TranslateFileName succeeds} {
  354.     catch {file delete ~/tf1}
  355.     createfile ~/tf1
  356.     file delete ~/tf1
  357. } {}
  358. test fCmd-5.8 {TclFileDeleteCmd: file doesn't exist: lstat(name) != 0} {
  359.     cleanup
  360.     set x [file exist tf1]
  361.     file delete tf1
  362.     list $x [file exist tf1]
  363. } {0 0}    
  364. test fCmd-5.9 {TclFileDeleteCmd: is directory} {
  365.     cleanup
  366.     file mkdir td1
  367.     file delete td1
  368.     file exist td1
  369. } {0}
  370. test fCmd-5.10 {TclFileDeleteCmd: TclpRemoveDirectory fails} {
  371.     cleanup
  372.     file mkdir td1/td2
  373.     list [catch {file delete td1} msg] $msg
  374. } {1 {error deleting "td1": directory not empty}}
  375.  
  376. test fCmd-6.1 {CopyRenameOneFile: bad source} {
  377.     # can't test this, because it's caught by FileCopyRename
  378. } {}
  379. test fCmd-6.2 {CopyRenameOneFile: bad target} {
  380.     # can't test this, because it's caught by FileCopyRename
  381. } {}
  382. test fCmd-6.3 {CopyRenameOneFile: lstat(source) != 0} {
  383.     cleanup
  384.     list [catch {file rename tf1 tf2} msg] $msg
  385. } {1 {error renaming "tf1": no such file or directory}}
  386. test fCmd-6.4 {CopyRenameOneFile: lstat(source) == 0} {
  387.     cleanup
  388.     createfile tf1
  389.     file rename tf1 tf2
  390.     glob tf*
  391. } {tf2}
  392. test fCmd-6.5 {CopyRenameOneFile: lstat(target) != 0} {
  393.     cleanup
  394.     createfile tf1
  395.     file rename tf1 tf2
  396.     glob tf*
  397. } {tf2}
  398. test fCmd-6.6 {CopyRenameOneFile: errno != ENOENT} {unixOnly} {
  399.     cleanup
  400.     file mkdir td1
  401.     testchmod 000 td1
  402.     createfile tf1
  403.     set msg [list [catch {file rename tf1 td1} msg] $msg]
  404.     testchmod 755 td1
  405.     set msg
  406. } {1 {error renaming "tf1" to "td1/tf1": permission denied}}
  407. test fCmd-6.7 {CopyRenameOneFile: errno != ENOENT} {95} {
  408.     cleanup
  409.     createfile tf1
  410.     list [catch {file rename tf1 $long} msg] $msg
  411. } [subst {1 {error renaming "tf1" to "$long": file name too long}}]
  412. test fCmd-6.8 {CopyRenameOneFile: errno != ENOENT} {macOnly} {
  413.     cleanup
  414.     createfile tf1
  415.     list [catch {file rename tf1 $long} msg] $msg
  416. } [subst {1 {error renaming "tf1" to "$long": file name too long}}]
  417. test fCmd-6.9 {CopyRenameOneFile: errno == ENOENT} {unixOnly} {
  418.     cleanup
  419.     createfile tf1
  420.     file rename tf1 tf2
  421.     glob tf*
  422. } {tf2}
  423. test fCmd-6.10 {CopyRenameOneFile: lstat(target) == 0} {
  424.     cleanup
  425.     createfile tf1
  426.     createfile tf2
  427.     list [catch {file rename tf1 tf2} msg] $msg
  428. } {1 {error renaming "tf1" to "tf2": file already exists}}
  429. test fCmd-6.11 {CopyRenameOneFile: force == 0} {
  430.     cleanup
  431.     createfile tf1
  432.     createfile tf2
  433.     list [catch {file rename tf1 tf2} msg] $msg
  434. } {1 {error renaming "tf1" to "tf2": file already exists}}
  435. test fCmd-6.12 {CopyRenameOneFile: force != 0} {
  436.     cleanup
  437.     createfile tf1
  438.     createfile tf2
  439.     file rename -force tf1 tf2
  440.     glob tf*
  441. } {tf2}
  442. test fCmd-6.13 {CopyRenameOneFile: source is dir, target is file} {
  443.     cleanup
  444.     file mkdir td1
  445.     file mkdir td2
  446.     createfile [file join td2 td1]
  447.     list [catch {file rename -force td1 td2} msg] $msg
  448. } [subst {1 {can't overwrite file "[file join td2 td1]" with directory "td1"}}]
  449. test fCmd-6.14 {CopyRenameOneFile: source is file, target is dir} {
  450.     cleanup
  451.     createfile tf1
  452.     file mkdir [file join td1 tf1]
  453.     list [catch {file rename -force tf1 td1} msg] $msg
  454. } [subst {1 {can't overwrite directory "[file join td1 tf1]" with file "tf1"}}]
  455. test fCmd-6.15 {CopyRenameOneFile: TclpRenameFile succeeds} {
  456.     cleanup
  457.     file mkdir [file join td1 td2]
  458.     file mkdir td2
  459.     createfile [file join td2 tf1]
  460.     file rename -force td2 td1
  461.     file exists [file join td1 td2 tf1]
  462. } {1}
  463. test fCmd-6.16 {CopyRenameOneFile: TclpCopyRenameOneFile fails} {
  464.     cleanup
  465.     file mkdir [file join td1 td2]
  466.     createfile [file join td1 td2 tf1]
  467.     file mkdir td2
  468.     list [catch {file rename -force td2 td1} msg] $msg
  469. } [subst {1 {error renaming "td2" to "[file join td1 td2]": file already exists}}]
  470. test fCmd-6.17 {CopyRenameOneFile: errno == EINVAL} {!$testConfig(win32s) || ($root == "C:/")} {
  471.     # Don't run this test under Win32s on a drive mounted from an NT 
  472.     # machine; it causes the NT machine to die.
  473.  
  474.     cleanup
  475.     list [catch {file rename -force $root tf1} msg] $msg
  476. } [subst {1 {error renaming "$root" to "tf1": trying to rename a volume or move a directory into itself}}]
  477. test fCmd-6.18 {CopyRenameOneFile: errno != EXDEV} {
  478.     cleanup
  479.     file mkdir [file join td1 td2]
  480.     createfile [file join td1 td2 tf1]
  481.     file mkdir td2
  482.     list [catch {file rename -force td2 td1} msg] $msg
  483. } [subst {1 {error renaming "td2" to "[file join td1 td2]": file already exists}}]
  484. test fCmd-6.19 {CopyRenameOneFile: errno == EXDEV} {unixOnly} {
  485.     cleanup /tmp
  486.     createfile tf1
  487.     file rename tf1 /tmp
  488.     glob tf* /tmp/tf1
  489. } {/tmp/tf1}
  490. test fCmd-6.20 {CopyRenameOneFile: errno == EXDEV} {pcOnly} {
  491.     catch {file delete -force c:/tcl8975@ d:/tcl8975@}
  492.     file mkdir c:/tcl8975@
  493.     if [catch {file rename c:/tcl8975@ d:/}] {
  494.     list d:/tcl8975@
  495.     } else {
  496.     set msg [glob c:/tcl8975@ d:/tcl8975@]
  497.     file delete -force d:/tcl8975@
  498.     set msg
  499.     }
  500. } {d:/tcl8975@}
  501. test fCmd-6.21 {CopyRenameOneFile: copy/rename: S_ISDIR(source)} {unixOnly} {
  502.     cleanup /tmp
  503.     file mkdir td1
  504.     file rename td1 /tmp
  505.     glob td* /tmp/td*
  506. } {/tmp/td1}
  507. test fCmd-6.22 {CopyRenameOneFile: copy/rename: !S_ISDIR(source)} {unixOnly} {
  508.     cleanup /tmp
  509.     createfile tf1
  510.     file rename tf1 /tmp
  511.     glob tf* /tmp/tf*
  512. } {/tmp/tf1}
  513. test fCmd-6.23 {CopyRenameOneFile: TclpCopyDirectory failed} {unixOnly xdev} {
  514.     cleanup /tmp
  515.     file mkdir td1/td2/td3
  516.     exec chmod 000 td1
  517.     set msg [list [catch {file rename td1 /tmp} msg] $msg]
  518.     exec chmod 755 td1
  519.     set msg 
  520. } {1 {error renaming "td1": permission denied}}
  521. test fCmd-6.24 {CopyRenameOneFile: error uses original name} {unixOnly} {
  522.     cleanup
  523.     file mkdir ~/td1/td2
  524.     exec chmod 000 [file join [file dirname ~] [file tail ~] td1]
  525.     set msg [list [catch {file copy ~/td1 td1} msg] $msg]
  526.     exec chmod 755 [file join [file dirname ~] [file tail ~] td1]
  527.     file delete -force ~/td1
  528.     set msg
  529. } {1 {error copying "~/td1": permission denied}}
  530. test fCmd-6.25 {CopyRenameOneFile: error uses original name} {unixOnly} {
  531.     cleanup
  532.     file mkdir td2
  533.     file mkdir ~/td1
  534.     exec chmod 000 [file join [file dirname ~] [file tail ~] td1]
  535.     set msg [list [catch {file copy td2 ~/td1} msg] $msg]
  536.     exec chmod 755 [file join [file dirname ~] [file tail ~] td1]
  537.     file delete -force ~/td1
  538.     set msg
  539. } {1 {error copying "td2" to "~/td1/td2": permission denied}}
  540. test fCmd-6.26 {CopyRenameOneFile: doesn't use original name} {unixOnly} {
  541.     cleanup
  542.     file mkdir ~/td1/td2
  543.     exec chmod 000 [file join [file dirname ~] [file tail ~] td1 td2]
  544.     set msg [list [catch {file copy ~/td1 td1} msg] $msg]
  545.     exec chmod 755 [file join [file dirname ~] [file tail ~] td1 td2]
  546.     file delete -force ~/td1
  547.     set msg
  548. } "1 {error copying \"~/td1\" to \"td1\": \"[file join [file dirname ~] [file tail ~] td1 td2]\": permission denied}"
  549. test fCmd-6.27 {CopyRenameOneFile: TclpCopyDirectory failed} {unixOnly xdev} {
  550.     cleanup /tmp
  551.     file mkdir td1/td2/td3
  552.     file mkdir /tmp/td1
  553.     createfile /tmp/td1/tf1
  554.     list [catch {file rename -force td1 /tmp} msg] $msg
  555. } {1 {error renaming "td1" to "/tmp/td1": file already exists}}
  556. test fCmd-6.28 {CopyRenameOneFile: TclpCopyDirectory failed} {unixOnly xdev} {
  557.     cleanup /tmp
  558.     file mkdir td1/td2/td3
  559.     exec chmod 000 td1/td2/td3 
  560.     set msg [list [catch {file rename td1 /tmp} msg] $msg]
  561.     exec chmod 755 td1/td2/td3 
  562.     set msg
  563. } {1 {error renaming "td1" to "/tmp/td1": "td1/td2/td3": permission denied}}
  564. test fCmd-6.29 {CopyRenameOneFile: TclpCopyDirectory passed} {unixOnly xdev} {
  565.     cleanup /tmp
  566.     file mkdir td1/td2/td3
  567.     file rename td1 /tmp
  568.     glob td* /tmp/td1/t*
  569. } {/tmp/td1/td2}
  570. test fCmd-6.30 {CopyRenameOneFile: TclpRemoveDirectory failed} {unixOnly nonPortable} {
  571.     cleanup
  572.     if [file exists /kernel] {
  573.         set msg [list [catch {file rename /kernel td1} msg] $msg]
  574.     set a1 {1 {can't unlink "/kernel": permission denied}}
  575.     expr {$msg == $a1}
  576.     } else {
  577.         list 1
  578.     }
  579. } {1}
  580. test fCmd-6.31 {CopyRenameOneFile: TclpDeleteFile passed} {unixOnly xdev} {
  581.     catch {cleanup /tmp}
  582.     file mkdir /tmp/td1
  583.     createfile /tmp/td1/tf1
  584.     file rename /tmp/td1/tf1 tf1
  585.     list [file exists /tmp/td1/tf1] [file exists tf1]
  586. } {0 1}
  587. test fCmd-6.32 {CopyRenameOneFile: copy} {
  588.     cleanup
  589.     list [catch {file copy tf1 tf2} msg] $msg
  590. } {1 {error copying "tf1": no such file or directory}}
  591. catch {cleanup /tmp}
  592.  
  593. test fCmd-7.1 {FileForceOption: none} {
  594.     cleanup
  595.     file mkdir [file join tf1 tf2]
  596.     list [catch {file delete tf1} msg] $msg
  597. } {1 {error deleting "tf1": directory not empty}}
  598. test fCmd-7.2 {FileForceOption: -force} {
  599.     cleanup
  600.     file mkdir [file join tf1 tf2]
  601.     file delete -force tf1
  602. } {}
  603. test fCmd-7.3 {FileForceOption: --} {
  604.     createfile -tf1
  605.     file delete -- -tf1
  606. } {}
  607. test fCmd-7.4 {FileForceOption: bad option} {
  608.     createfile -tf1
  609.     set msg [list [catch {file delete -tf1} msg] $msg]
  610.     file delete -- -tf1
  611.     set msg
  612. } {1 {bad option "-tf1": should be -force or --}}
  613. test fCmd-7.5 {FileForceOption: multiple times through loop} {
  614.     createfile --
  615.     createfile -force
  616.     file delete -force -force -- -- -force
  617.     list [catch {glob -- -- -force} msg] $msg
  618. } {1 {no files matched glob patterns "-- -force"}}
  619.  
  620. test fCmd-8.1 {FileBasename: basename of ~user: argc == 1 && *path == ~} {unixOnly nonPortable} {
  621.     list [catch {file rename ~$user /} msg] $msg
  622. } "1 {error renaming \"~$user\" to \"/[file tail ~$user]\": permission denied}"
  623.  
  624. test fCmd-9.1 {file rename: comprehensive: EACCES} {unixOnly} {
  625.     cleanup
  626.     file mkdir td1
  627.     list [catch {file rename td1 /} msg] $msg
  628. } {1 {error renaming "td1" to "/td1": permission denied}}
  629. test fCmd-9.2 {file rename: comprehensive: source doesn't exist} {
  630.     cleanup
  631.     list [catch {file rename tf1 tf2} msg] $msg
  632. } {1 {error renaming "tf1": no such file or directory}}
  633. test fCmd-9.3 {file rename: comprehensive: file to new name} {
  634.     cleanup
  635.     createfile tf1
  636.     createfile tf2
  637.     testchmod 444 tf2
  638.     file rename tf1 tf3
  639.     file rename tf2 tf4
  640.     list [lsort [glob tf*]] [file writable tf3] [file writable tf4]
  641. } {{tf3 tf4} 1 0}    
  642. test fCmd-9.4 {file rename: comprehensive: dir to new name} {unixOrPc} {
  643.     cleanup
  644.     file mkdir td1 td2
  645.     testchmod 555 td2
  646.     file rename td1 td3
  647.     file rename td2 td4
  648.     list [lsort [glob td*]] [file writable td3] [file writable td4]
  649. } {{td3 td4} 1 0}    
  650. test fCmd-9.5 {file rename: comprehensive: file to self} {
  651.     cleanup
  652.     createfile tf1 tf1
  653.     createfile tf2 tf2
  654.     testchmod 444 tf2
  655.     file rename -force tf1 tf1
  656.     file rename -force tf2 tf2
  657.     list [contents tf1] [contents tf2] [file writable tf1] [file writable tf2]
  658. } {tf1 tf2 1 0}    
  659. test fCmd-9.6 {file rename: comprehensive: dir to self} {unixOrPc} {
  660.     cleanup
  661.     file mkdir td1
  662.     file mkdir td2
  663.     testchmod 555 td2
  664.     file rename -force td1 .
  665.     file rename -force td2 .
  666.     list [lsort [glob td*]] [file writable td1] [file writable td2]
  667. } {{td1 td2} 1 0}    
  668. test fCmd-9.7 {file rename: comprehensive: file to existing file} {
  669.     cleanup
  670.     createfile tf1
  671.     createfile tf2
  672.     createfile tfs1
  673.     createfile tfs2
  674.     createfile tfs3
  675.     createfile tfs4
  676.     createfile tfd1
  677.     createfile tfd2
  678.     createfile tfd3
  679.     createfile tfd4
  680.     testchmod 444 tfs3
  681.     testchmod 444 tfs4
  682.     testchmod 444 tfd2
  683.     testchmod 444 tfd4
  684.     set msg [list [catch {file rename tf1 tf2} msg] $msg]
  685.     file rename -force tfs1 tfd1
  686.     file rename -force tfs2 tfd2
  687.     file rename -force tfs3 tfd3
  688.     file rename -force tfs4 tfd4
  689.     list [lsort [glob tf*]] $msg [file writable tfd1] [file writable tfd2] [file writable tfd3] [file writable tfd4] 
  690. } {{tf1 tf2 tfd1 tfd2 tfd3 tfd4} {1 {error renaming "tf1" to "tf2": file already exists}} 1 1 0 0}
  691. test fCmd-9.8 {file rename: comprehensive: dir to empty dir} {
  692.     # Under unix, you can rename a read-only directory, but you can't
  693.     # move it into another directory.
  694.  
  695.     cleanup
  696.     file mkdir td1
  697.     file mkdir [file join td2 td1]
  698.     file mkdir tds1
  699.     file mkdir tds2
  700.     file mkdir tds3
  701.     file mkdir tds4
  702.     file mkdir [file join tdd1 tds1]
  703.     file mkdir [file join tdd2 tds2]
  704.     file mkdir [file join tdd3 tds3]
  705.     file mkdir [file join tdd4 tds4]
  706.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  707.     testchmod 555 tds3
  708.     testchmod 555 tds4
  709.     }
  710.     if {$tcl_platform(platform) != "macintosh"} {
  711.         testchmod 555 [file join tdd2 tds2]
  712.         testchmod 555 [file join tdd4 tds4]
  713.     }
  714.     set msg [list [catch {file rename td1 td2} msg] $msg]
  715.     file rename -force tds1 tdd1
  716.     file rename -force tds2 tdd2
  717.     file rename -force tds3 tdd3
  718.     file rename -force tds4 tdd4
  719.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  720.     set w3 [file writable [file join tdd3 tds3]]
  721.     set w4 [file writable [file join tdd4 tds4]]
  722.     } else {
  723.     set w3 0
  724.     set w4 0
  725.     }
  726.     list [lsort [glob td*]] $msg [file writable [file join tdd1 tds1]] \
  727.     [file writable [file join tdd2 tds2]] $w3 $w4
  728. } [subst {{td1 td2 tdd1 tdd2 tdd3 tdd4} {1 {error renaming "td1" to "[file join td2 td1]": file already exists}} 1 1 0 0}]
  729. test fCmd-9.9 {file rename: comprehensive: dir to non-empty dir} {
  730.     cleanup
  731.     file mkdir tds1
  732.     file mkdir tds2
  733.     file mkdir [file join tdd1 tds1 xxx]
  734.     file mkdir [file join tdd2 tds2 xxx]
  735.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  736.     testchmod 555 tds2
  737.     }
  738.     set a1 [list [catch {file rename -force tds1 tdd1} msg] $msg]
  739.     set a2 [list [catch {file rename -force tds2 tdd2} msg] $msg]
  740.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  741.     set w2 [file writable tds2]
  742.     } else {
  743.     set w2 0
  744.     }
  745.     list [lsort [glob td*]] $a1 $a2 [file writable tds1] $w2
  746. } [subst {{tdd1 tdd2 tds1 tds2} {1 {error renaming "tds1" to "[file join tdd1 tds1]": file already exists}} {1 {error renaming "tds2" to "[file join tdd2 tds2]": file already exists}} 1 0}]
  747. test fCmd-9.10 {file rename: comprehensive: file to new name and dir} {
  748.     cleanup
  749.     createfile tf1
  750.     createfile tf2
  751.     file mkdir td1
  752.     testchmod 444 tf2
  753.     file rename tf1 [file join td1 tf3]
  754.     file rename tf2 [file join td1 tf4]
  755.     list [catch {glob tf*}] [lsort [glob [file join td1 t*]]] \
  756.     [file writable [file join td1 tf3]] [file writable [file join td1 tf4]]
  757. } [subst {1 {[file join td1 tf3] [file join td1 tf4]} 1 0}]
  758. test fCmd-9.11 {file rename: comprehensive: dir to new name and dir} {
  759.     cleanup
  760.     file mkdir td1
  761.     file mkdir td2
  762.     file mkdir td3
  763.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  764.     testchmod 555 td2
  765.     }
  766.     file rename td1 [file join td3 td3]
  767.     file rename td2 [file join td3 td4]
  768.     if {$tcl_platform(platform) != "unix" && $tcl_platform(platform) != "macintosh"} {
  769.     set w4 [file writable [file join td3 td4]]
  770.     } else {
  771.         set w4 0
  772.     }
  773.     list [lsort [glob td*]] [lsort [glob [file join td3 t*]]] \
  774.     [file writable [file join td3 td3]] $w4
  775. } [subst {td3 {[file join td3 td3] [file join td3 td4]} 1 0}]
  776. test fCmd-9.12 {file rename: comprehensive: target exists} {
  777.     cleanup
  778.     file mkdir [file join td1 td2] [file join td2 td1]
  779.     if {$tcl_platform(platform) != "macintosh"} {
  780.         testchmod 555 [file join td2 td1]
  781.     }
  782.     file mkdir [file join td3 td4] [file join td4 td3]
  783.     file rename -force td3 td4
  784.     set msg [list [file exists td3] [file exists [file join td4 td3 td4]] \
  785.     [catch {file rename td1 td2} msg] $msg]
  786.     if {$tcl_platform(platform) != "macintosh"} {
  787.         testchmod 755 [file join td2 td1]
  788.     }
  789.     set msg
  790. } [subst {0 1 1 {error renaming "td1" to "[file join td2 td1]": file already exists}}]
  791. test fCmd-9.13 {file rename: comprehensive: can't overwrite target} {
  792.     cleanup
  793.     file mkdir [file join td1 td2] [file join td2 td1 td4]
  794.     list [catch {file rename -force td1 td2} msg] $msg
  795. } [subst {1 {error renaming "td1" to "[file join td2 td1]": file already exists}}]
  796. test fCmd-9.14 {file rename: comprehensive: dir into self} {
  797.     cleanup
  798.     file mkdir td1
  799.     list [glob td*] [list [catch {file rename td1 td1} msg] $msg]
  800. } [subst {td1 {1 {error renaming "td1" to "[file join td1 td1]": trying to rename a volume or move a directory into itself}}}]
  801. test fCmd-9.15 {file rename: comprehensive: source and target incompatible} {
  802.     cleanup
  803.     file mkdir td1
  804.     createfile tf1
  805.     list [catch {file rename -force td1 tf1} msg] $msg
  806. } {1 {can't overwrite file "tf1" with directory "td1"}}
  807. test fCmd-9.16 {file rename: comprehensive: source and target incompatible} {
  808.     cleanup
  809.     file mkdir td1/tf1
  810.     createfile tf1
  811.     list [catch {file rename -force tf1 td1} msg] $msg
  812. } [subst {1 {can't overwrite directory "[file join td1 tf1]" with file "tf1"}}]
  813.  
  814. test fCmd-10.1 {file copy: comprehensive: source doesn't exist} {
  815.     cleanup
  816.     list [catch {file copy tf1 tf2} msg] $msg
  817. } {1 {error copying "tf1": no such file or directory}}
  818. test fCmd-10.2 {file copy: comprehensive: file to new name} {
  819.     cleanup
  820.     createfile tf1 tf1
  821.     createfile tf2 tf2
  822.     testchmod 444 tf2
  823.     file copy tf1 tf3
  824.     file copy tf2 tf4
  825.     list [lsort [glob tf*]] [contents tf3] [contents tf4] [file writable tf3] [file writable tf4]
  826. } {{tf1 tf2 tf3 tf4} tf1 tf2 1 0}
  827. test fCmd-10.3 {file copy: comprehensive: dir to new name} {unixOrPc} {
  828.     cleanup
  829.     file mkdir [file join td1 tdx]
  830.     file mkdir [file join td2 tdy]
  831.     testchmod 555 td2
  832.     file copy td1 td3
  833.     file copy td2 td4
  834.     set msg [list [lsort [glob td*]] [glob [file join td3 t*]] \
  835.         [glob [file join td4 t*]] [file writable td3] [file writable td4]]
  836.     if {$tcl_platform(platform) != "macintosh"} {
  837.         testchmod 755 td2
  838.         testchmod 755 td4
  839.     }
  840.     set msg
  841. } [subst {{td1 td2 td3 td4} [file join td3 tdx] [file join td4 tdy] 1 0}]
  842. test fCmd-10.4 {file copy: comprehensive: file to existing file} {
  843.     cleanup
  844.     createfile tf1
  845.     createfile tf2
  846.     createfile tfs1
  847.     createfile tfs2
  848.     createfile tfs3
  849.     createfile tfs4
  850.     createfile tfd1
  851.     createfile tfd2
  852.     createfile tfd3
  853.     createfile tfd4
  854.     testchmod 444 tfs3
  855.     testchmod 444 tfs4
  856.     testchmod 444 tfd2
  857.     testchmod 444 tfd4
  858.     set msg [list [catch {file copy tf1 tf2} msg] $msg]
  859.     file copy -force tfs1 tfd1
  860.     file copy -force tfs2 tfd2
  861.     file copy -force tfs3 tfd3
  862.     file copy -force tfs4 tfd4
  863.     list [lsort [glob tf*]] $msg [file writable tfd1] [file writable tfd2] [file writable tfd3] [file writable tfd4] 
  864. } {{tf1 tf2 tfd1 tfd2 tfd3 tfd4 tfs1 tfs2 tfs3 tfs4} {1 {error copying "tf1" to "tf2": file already exists}} 1 1 0 0}
  865. test fCmd-10.5 {file copy: comprehensive: dir to empty dir} {
  866.     cleanup
  867.     file mkdir td1
  868.     file mkdir [file join td2 td1]
  869.     file mkdir tds1
  870.     file mkdir tds2
  871.     file mkdir tds3
  872.     file mkdir tds4
  873.     file mkdir [file join tdd1 tds1]
  874.     file mkdir [file join tdd2 tds2]
  875.     file mkdir [file join tdd3 tds3]
  876.     file mkdir [file join tdd4 tds4]
  877.     if {$tcl_platform(platform) != "macintosh"} {
  878.     testchmod 555 tds3
  879.     testchmod 555 tds4
  880.     testchmod 555 [file join tdd2 tds2]
  881.     testchmod 555 [file join tdd4 tds4]
  882.     }
  883.     set a1 [list [catch {file copy td1 td2} msg] $msg]
  884.     set a2 [list [catch {file copy -force tds1 tdd1} msg] $msg]
  885.     set a3 [catch {file copy -force tds2 tdd2}]
  886.     set a4 [catch {file copy -force tds3 tdd3}]
  887.     set a5 [catch {file copy -force tds4 tdd4}]
  888.     list [lsort [glob td*]] $a1 $a2 $a3 $a4 $a5 
  889. } [subst {{td1 td2 tdd1 tdd2 tdd3 tdd4 tds1 tds2 tds3 tds4} {1 {error copying "td1" to "[file join td2 td1]": file already exists}} {1 {error copying "tds1" to "[file join tdd1 tds1]": file already exists}} 1 1 1}]
  890. test fCmd-10.6 {file copy: comprehensive: dir to non-empty dir} {unixOrPc} {
  891.     cleanup
  892.     file mkdir tds1
  893.     file mkdir tds2
  894.     file mkdir [file join tdd1 tds1 xxx]
  895.     file mkdir [file join tdd2 tds2 xxx]
  896.     testchmod 555 tds2
  897.     set a1 [list [catch {file copy -force tds1 tdd1} msg] $msg]
  898.     set a2 [list [catch {file copy -force tds2 tdd2} msg] $msg]
  899.     list [lsort [glob td*]] $a1 $a2 [file writable tds1] [file writable tds2]
  900. } [subst {{tdd1 tdd2 tds1 tds2} {1 {error copying "tds1" to "[file join tdd1 tds1]": file already exists}} {1 {error copying "tds2" to "[file join tdd2 tds2]": file already exists}} 1 0}]
  901. test fCmd-10.7 {file rename: comprehensive: file to new name and dir} {
  902.     cleanup
  903.     createfile tf1
  904.     createfile tf2
  905.     file mkdir td1
  906.     testchmod 444 tf2
  907.     file copy tf1 [file join td1 tf3]
  908.     file copy tf2 [file join td1 tf4]
  909.     list [lsort [glob tf*]] [lsort [glob [file join td1 t*]]] \
  910.     [file writable [file join td1 tf3]] [file writable [file join td1 tf4]]
  911. } [subst {{tf1 tf2} {[file join td1 tf3] [file join td1 tf4]} 1 0}]
  912. test fCmd-10.8 {file rename: comprehensive: dir to new name and dir} {unixOrPc} {
  913.     cleanup
  914.     file mkdir td1
  915.     file mkdir td2
  916.     file mkdir td3
  917.     testchmod 555 td2
  918.     file copy td1 [file join td3 td3]
  919.     file copy td2 [file join td3 td4]
  920.     list [lsort [glob td*]] [lsort [glob [file join td3 t*]]] \
  921.     [file writable [file join td3 td3]] [file writable [file join td3 td4]]
  922. } [subst {{td1 td2 td3} {[file join td3 td3] [file join td3 td4]} 1 0}]
  923. test fCmd-10.9 {file copy: comprehensive: source and target incompatible} {
  924.     cleanup
  925.     file mkdir td1
  926.     createfile tf1
  927.     list [catch {file copy -force td1 tf1} msg] $msg
  928. } {1 {can't overwrite file "tf1" with directory "td1"}}
  929. test fCmd-10.10 {file copy: comprehensive: source and target incompatible} {
  930.     cleanup
  931.     file mkdir [file join td1 tf1]
  932.     createfile tf1
  933.     list [catch {file copy -force tf1 td1} msg] $msg
  934. } [subst {1 {can't overwrite directory "[file join td1 tf1]" with file "tf1"}}]
  935. cleanup    
  936.  
  937. # old tests    
  938.  
  939. test fCmd-11.1 {TclFileRenameCmd: -- option } {
  940.     catch {file delete -force -- -tfa1}
  941.     set s [createfile -tfa1]
  942.     file rename -- -tfa1 tfa2
  943.     set result [expr [checkcontent tfa2 $s] && ![file exists -tfa1]]
  944.     file delete tfa2
  945.     set result
  946. } {1}
  947.  
  948. test fCmd-11.2 {TclFileRenameCmd: bad option } {
  949.     catch {file delete -force -- tfa1}
  950.     set s [createfile tfa1]
  951.     set r1 [catch {file rename -x tfa1 tfa2}]
  952.     set result [expr $r1 && [checkcontent tfa1 $s] && ![file exists tfa2]]
  953.     file delete tfa1
  954.     set result
  955. } {1}
  956.  
  957. test fCmd-11.3 {TclFileRenameCmd: bad \# args} {
  958.     catch {file rename -- }
  959. } {1}
  960.  
  961. test fCmd-11.4 {TclFileRenameCmd: target filename translation failing} {
  962.      global env
  963.      set temp $env(HOME)
  964.      unset env(HOME)
  965.      set result [catch {file rename tfa ~/foobar }]
  966.      set env(HOME) $temp
  967.      set result
  968.  } {1}
  969.  
  970. test fCmd-11.5 {TclFileRenameCmd: more than one source and target is not a directory} {
  971.     catch {file delete -force -- tfa1 tfa2 tfa3}
  972.     createfile tfa1 
  973.     createfile tfa2 
  974.     createfile tfa3 
  975.     set result [catch {file rename tfa1 tfa2 tfa3}]
  976.     file delete tfa1 tfa2 tfa3
  977.     set result
  978. } {1}
  979.  
  980. test fCmd-11.6 {TclFileRenameCmd: : single file into directory  } {
  981.     catch {file delete -force -- tfa1 tfad}
  982.     set s [createfile tfa1]
  983.     file mkdir tfad
  984.     file rename tfa1 tfad
  985.     set result [expr [checkcontent tfad/tfa1 $s] && ![file exists tfa1]]
  986.     file delete -force tfad
  987.     set result
  988. } {1}
  989.  
  990. test fCmd-11.7 {TclFileRenameCmd: : multiple files into directory  } {
  991.     catch {file delete -force -- tfa1 tfa2 tfad}
  992.     set s1 [createfile tfa1 ]
  993.     set s2 [createfile tfa2 ]
  994.     file mkdir tfad
  995.     file rename tfa1 tfa2 tfad
  996.     set r1 [checkcontent tfad/tfa1 $s1]
  997.     set r2 [checkcontent tfad/tfa2 $s2]
  998.     
  999.     set result [expr $r1 && $r2 && ![file exists tfa1] && ![file exists tfa2]]
  1000.         
  1001.     file delete -force tfad
  1002.     set result
  1003. } {1}
  1004.  
  1005. test fCmd-11.8 {TclFileRenameCmd: error renaming file to directory } {
  1006.     catch {file delete -force -- tfa tfad}
  1007.     set s [createfile tfa ]
  1008.     file mkdir tfad
  1009.     file mkdir tfad/tfa
  1010.     set r1 [catch {file rename tfa tfad}]
  1011.     set r2 [checkcontent tfa $s]
  1012.     set r3 [file isdir tfad]
  1013.     set result [expr $r1 && $r2 && $r3 ]
  1014.     file delete -force tfa tfad
  1015.     set result
  1016. } {1}
  1017.  
  1018. #
  1019. # Coverage tests for renamefile() ;
  1020. #
  1021. test fCmd-12.1 {renamefile: source filename translation failing} {
  1022.     global env
  1023.     set temp $env(HOME)
  1024.     unset env(HOME)
  1025.     set result [catch {file rename ~/tfa1 tfa2}]
  1026.     set env(HOME) $temp
  1027.     set result
  1028. } {1}
  1029.  
  1030. test fCmd-12.2 {renamefile: src filename translation failing} {
  1031.     global env
  1032.     set temp $env(HOME)
  1033.     unset env(HOME)
  1034.     set s [createfile tfa1]
  1035.     file mkdir tfad
  1036.     set result [catch {file rename tfa1 ~/tfa2 tfad}]
  1037.     set env(HOME) $temp
  1038.     file delete -force tfad
  1039.     set result
  1040. } {1}
  1041.  
  1042. test fCmd-12.3 {renamefile: stat failing on source} {
  1043.     catch {file delete -force -- tfa1 tfa2}
  1044.     set r1 [catch {file rename tfa1 tfa2}]
  1045.     expr {$r1 && ![file exists tfa1] && ![file exists tfa2]}
  1046. } {1}
  1047.  
  1048. test fCmd-12.4 {renamefile: error renaming file to directory } {
  1049.     catch {file delete -force -- tfa tfad}
  1050.     set s1 [createfile tfa ]
  1051.     file mkdir tfad
  1052.     file mkdir tfad/tfa
  1053.     set r1 [catch {file rename tfa tfad}]
  1054.     set r2 [checkcontent tfa $s1]
  1055.     set r3 [file isdir tfad/tfa]
  1056.     set result [expr $r1 && $r2 && $r3]
  1057.     file delete -force tfa tfad
  1058.     set result
  1059. } {1}
  1060.  
  1061. test fCmd-12.5 {renamefile: error renaming directory to file } {
  1062.     catch {file delete -force -- tfa tfad}
  1063.     file mkdir tfa
  1064.     file mkdir tfad
  1065.     set s [createfile tfad/tfa]
  1066.     set r1 [catch {file rename tfa tfad}]
  1067.     set r2 [checkcontent tfad/tfa $s]
  1068.     set r3 [file isdir tfad]
  1069.     set r4 [file isdir tfa]
  1070.     set result [expr $r1 && $r2 && $r3 && $r4 ]
  1071.     file delete -force tfa tfad
  1072.     set result
  1073. } {1}
  1074.  
  1075. test fCmd-12.6 {renamefile: TclRenameFile succeeding } {
  1076.     catch {file delete -force -- tfa1 tfa2}
  1077.     set s [createfile tfa1]
  1078.     file rename tfa1 tfa2
  1079.     set result [expr [checkcontent tfa2 $s] && ![file exists tfa1]]
  1080.     file delete tfa2
  1081.     set result
  1082. } {1}
  1083.  
  1084. test fCmd-12.7 {renamefile: renaming directory into offspring} {
  1085.     catch {file delete -force -- tfad}
  1086.     file mkdir tfad
  1087.     file mkdir tfad/dir
  1088.     set result [catch {file rename tfad tfad/dir}]
  1089.     file delete -force tfad 
  1090.     set result
  1091. } {1}
  1092.  
  1093. test fCmd-12.8 {renamefile: generic error } {unixOnly} {
  1094.     catch {file delete -force -- tfa}
  1095.     file mkdir tfa
  1096.     file mkdir tfa/dir
  1097.     exec chmod 555 tfa
  1098.     set result [catch {file rename tfa/dir tfa2}]
  1099.     exec chmod 777 tfa
  1100.     file delete -force tfa
  1101.     set result
  1102. } {1}
  1103.  
  1104.  
  1105. test fCmd-12.9 {renamefile: moving a file across volumes } {unixOnly} {
  1106.     catch {file delete -force -- tfa /tmp/tfa}
  1107.     set s [createfile tfa ]
  1108.     file rename tfa /tmp
  1109.     set result [expr [checkcontent /tmp/tfa $s] && ![file exists tfa]]
  1110.     file delete /tmp/tfa
  1111.     set result
  1112. } {1}
  1113.  
  1114. test fCmd-12.10 {renamefile: moving a directory across volumes } {unixOnly} {
  1115.     catch {file delete -force -- tfad /tmp/tfad}
  1116.     file mkdir tfad
  1117.     set s [createfile tfad/a ]
  1118.     file rename tfad /tmp
  1119.     set restul [expr [checkcontent /tmp/tfad/a $s] && ![file exists tfad]]
  1120.     file delete -force /tmp/tfad
  1121.     set result
  1122. } {1}
  1123.  
  1124. #
  1125. # Coverage tests for TclCopyFilesCmd()
  1126. #
  1127. test fCmd-13.1 {TclCopyFilesCmd: -force option } {
  1128.     catch {file delete -force -- tfa1}
  1129.     set s [createfile tfa1]
  1130.     file copy -force  tfa1 tfa2
  1131.     set result [expr [checkcontent tfa2 $s] && [checkcontent tfa1 $s]]
  1132.     file delete tfa1 tfa2
  1133.     set result
  1134. } {1}
  1135.  
  1136. test fCmd-13.2 {TclCopyFilesCmd: -- option } {
  1137.     catch {file delete -force -- tfa1}
  1138.     set s [createfile -tfa1]
  1139.     file copy --  -tfa1 tfa2
  1140.     set result [expr [checkcontent tfa2 $s] &&  [checkcontent -tfa1 $s]]
  1141.     file delete -- -tfa1 tfa2
  1142.     set result
  1143. } {1}
  1144.  
  1145. test fCmd-13.3 {TclCopyFilesCmd: bad option } {
  1146.     catch {file delete -force -- tfa1}
  1147.     set s [createfile tfa1]
  1148.     set r1 [catch {file copy -x tfa1 tfa2}]
  1149.     set result [expr $r1 && [checkcontent tfa1 $s] && ![file exists tfa2]]
  1150.     file delete tfa1
  1151.     set result
  1152. } {1}
  1153.  
  1154. test fCmd-13.4 {TclCopyFilesCmd: bad \# args} {
  1155.     catch {file copy -- }
  1156. } {1}
  1157.  
  1158. test fCmd-13.5 {TclCopyFilesCmd: target filename translation failing} {
  1159.      global env
  1160.      set temp $env(HOME)
  1161.     unset env(HOME)
  1162.      set result [catch {file copy tfa ~/foobar }]
  1163.      set env(HOME) $temp
  1164.      set result
  1165.  } {1}
  1166.  
  1167. test fCmd-13.6 {TclCopyFilesCmd: more than one source and target is not a directory} {
  1168.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1169.     createfile tfa1 
  1170.     createfile tfa2 
  1171.     createfile tfa3 
  1172.     set result [catch {file copy tfa1 tfa2 tfa3}]
  1173.     file delete tfa1 tfa2 tfa3
  1174.     set result
  1175. } {1}
  1176.  
  1177. test fCmd-13.7 {TclCopyFilesCmd: : single file into directory  } {
  1178.     catch {file delete -force -- tfa1 tfad}
  1179.     set s [createfile tfa1]
  1180.     file mkdir tfad
  1181.     file copy tfa1 tfad
  1182.     set result [expr [checkcontent tfad/tfa1 $s] &&  [checkcontent tfa1 $s]]
  1183.     file delete -force tfad tfa1
  1184.     set result
  1185. } {1}
  1186.  
  1187. test fCmd-13.8 {TclCopyFilesCmd: : multiple files into directory  } {
  1188.     catch {file delete -force -- tfa1 tfa2 tfad}
  1189.     set s1 [createfile tfa1 ]
  1190.     set s2 [createfile tfa2 ]
  1191.     file mkdir tfad
  1192.     file copy tfa1 tfa2 tfad
  1193.     set r1 [checkcontent tfad/tfa1 $s1]
  1194.     set r2 [checkcontent tfad/tfa2 $s2]
  1195.     set r3 [checkcontent tfa1 $s1]
  1196.     set r4 [checkcontent tfa2 $s2]
  1197.     set result [expr $r1 && $r2 && $r3 && $r4 ]
  1198.         
  1199.     file delete -force tfad tfa1 tfa2
  1200.     set result
  1201. } {1}
  1202.  
  1203. test fCmd-13.9 {TclCopyFilesCmd: error copying file to directory } {
  1204.     catch {file delete -force -- tfa tfad}
  1205.     set s [createfile tfa ]
  1206.     file mkdir tfad
  1207.     file mkdir tfad/tfa
  1208.     set r1 [catch {file copy tfa tfad}]
  1209.     set r2 [expr [checkcontent tfa $s] && [file isdir tfad/tfa]]
  1210.     set r3 [file isdir tfad]
  1211.     set result [expr $r1 && $r2 && $r3 ]
  1212.     file delete -force tfa tfad
  1213.     set result
  1214. } {1}
  1215.  
  1216. #
  1217. # Coverage tests for copyfile()
  1218. test fCmd-14.1 {copyfile: source filename translation failing} {
  1219.     global env
  1220.     set temp $env(HOME)
  1221.     unset env(HOME)
  1222.     set result [catch {file copy ~/tfa1 tfa2}]
  1223.     set env(HOME) $temp
  1224.     set result
  1225. } {1}
  1226.  
  1227. test fCmd-14.2 {copyfile: dst filename translation failing} {
  1228.     global env
  1229.     set temp $env(HOME)
  1230.     unset env(HOME)
  1231.     set s [createfile tfa1]
  1232.     file mkdir tfad
  1233.     set r1 [catch {file copy tfa1 ~/tfa2 tfad}]
  1234.     set result [expr $r1 && [checkcontent tfad/tfa1 $s]]
  1235.     set env(HOME) $temp
  1236.     file delete -force tfa1 tfad
  1237.     set result
  1238. } {1}
  1239.  
  1240. test fCmd-14.3 {copyfile: stat failing on source} {
  1241.     catch {file delete -force -- tfa1 tfa2}
  1242.     set r1 [catch {file copy tfa1 tfa2}]
  1243.     expr $r1 && ![file exists tfa1] && ![file exists tfa2]
  1244. } {1}
  1245.  
  1246. test fCmd-14.4 {copyfile: error copying file to directory } {
  1247.     catch {file delete -force -- tfa tfad}
  1248.     set s1 [createfile tfa ]
  1249.     file mkdir tfad
  1250.     file mkdir tfad/tfa
  1251.     set r1 [catch {file copy tfa tfad}]
  1252.     set r2 [checkcontent tfa $s1]
  1253.     set r3 [file isdir tfad]
  1254.     set r4 [file isdir tfad/tfa]
  1255.     set result [expr $r1 && $r2 && $r3 && $r4 ]
  1256.     file delete -force tfa tfad
  1257.     set result
  1258. } {1}
  1259.  
  1260.  test fCmd-14.5 {copyfile: error copying directory to file } {
  1261.      catch {file delete -force -- tfa tfad}
  1262.      file mkdir tfa
  1263.      file mkdir tfad
  1264.      set s [createfile tfad/tfa]
  1265.      set r1 [catch {file copy tfa tfad}]
  1266.      set r2 [checkcontent tfad/tfa $s]
  1267.      set r3 [file isdir tfad]
  1268.      set r4 [file isdir tfa]
  1269.      set result [expr $r1 && $r2 && $r3 && $r4 ]
  1270.      file delete -force tfa tfad
  1271.      set result
  1272. } {1}
  1273.  
  1274. test fCmd-14.6 {copyfile: copy file succeeding } {
  1275.     catch {file delete -force -- tfa tfa2}
  1276.     set s [createfile tfa]
  1277.     file copy tfa tfa2
  1278.     set result [expr  [checkcontent tfa $s] && [checkcontent tfa2 $s]]
  1279.     file delete tfa tfa2
  1280.     set result
  1281. } {1}
  1282.  
  1283. test fCmd-14.7 {copyfile: copy directory succeeding } {
  1284.     catch {file delete -force -- tfa tfa2}
  1285.     file mkdir tfa
  1286.     set s [createfile tfa/file]
  1287.     file copy tfa tfa2
  1288.     set result [expr [checkcontent tfa/file $s] && [checkcontent tfa2/file $s]]
  1289.     file delete -force tfa tfa2
  1290.     set result
  1291. } {1}
  1292.  
  1293. test fCmd-14.8 {copyfile: copy directory failing } {unixOnly} {
  1294.     catch {file delete -force -- tfa}
  1295.     file mkdir tfa/dir/a/b/c
  1296.     exec chmod 000 tfa/dir
  1297.     set r1 [catch {file copy tfa tfa2}]
  1298.     exec chmod 777 tfa/dir
  1299.     set result $r1
  1300.     file delete -force tfa tfa2
  1301.     set result
  1302. } {1}
  1303.  
  1304. #
  1305. # Coverage tests for TclMkdirCmd()
  1306. #
  1307. test fCmd-15.1 {TclMakeDirsCmd: target filename translation failing} {
  1308.     global env
  1309.     set temp $env(HOME)
  1310.     unset env(HOME) 
  1311.     set result [catch {file mkdir ~/tfa}]
  1312.     set env(HOME) $temp
  1313.     set result
  1314. } {1}
  1315. #
  1316. # Can Tcl_SplitPath return argc == 0? If so them we need a
  1317. # test for that code.
  1318. #
  1319. test fCmd-15.2 {TclMakeDirsCmd - one directory } {
  1320.     catch {file delete -force -- tfa}
  1321.     file mkdir tfa
  1322.     set result [file isdirectory tfa]
  1323.     file delete tfa
  1324.     set result
  1325. } {1}
  1326.  
  1327. test fCmd-15.3 {TclMakeDirsCmd: - two directories } {
  1328.     catch {file delete -force -- tfa1 tfa2}
  1329.     file mkdir tfa1 tfa2
  1330.     set result [expr [file isdirectory tfa1] && [file isdirectory tfa2]]
  1331.     file delete tfa1 tfa2
  1332.     set result
  1333. } {1}
  1334.  
  1335. test fCmd-15.4 {TclMakeDirsCmd - stat failing } {unixOnly} {
  1336.     catch {file delete -force -- tfa}
  1337.     file mkdir tfa
  1338.     createfile tfa/file
  1339.     exec chmod 000 tfa
  1340.     set result [catch {file mkdir tfa/file}]
  1341.     exec chmod 777 tfa
  1342.     file delete -force tfa
  1343.     set result
  1344. } {1}
  1345.  
  1346. test fCmd-15.5 {TclMakeDirsCmd: - making a directory several levels deep } {
  1347.     catch {file delete -force -- tfa}
  1348.     file mkdir tfa/a/b/c
  1349.     set result [file isdir tfa/a/b/c]
  1350.     file delete -force tfa
  1351.     set result
  1352. } {1}
  1353.  
  1354.     
  1355. test fCmd-15.6 {TclMakeDirsCmd: - trying to overwrite a file } {
  1356.     catch {file delete -force -- tfa}
  1357.     set s [createfile tfa]
  1358.     set r1 [catch {file mkdir tfa}]
  1359.     set r2 [file isdir tfa]
  1360.     set r3 [file exists tfa]
  1361.     set result [expr $r1 && !$r2 && $r3 && [checkcontent tfa $s]]
  1362.     file delete tfa
  1363.     set result
  1364. } {1}
  1365.  
  1366. test fCmd-15.7 {TclMakeDirsCmd - making several directories } {
  1367.     catch {file delete -force -- tfa1 tfa2}
  1368.     file mkdir tfa1 tfa2/a/b/c
  1369.     set result [expr [file isdir tfa1] && [file isdir tfa2/a/b/c]]
  1370.     file delete -force tfa1 tfa2
  1371.     set result
  1372. } {1}
  1373.  
  1374. test fCmd-15.8 {TclFileMakeDirsCmd: trying to create an existing dir} {
  1375.     file mkdir tfa
  1376.     file mkdir tfa
  1377.     set result [file isdir tfa]
  1378.     file delete tfa
  1379.     set result
  1380. } {1}
  1381.  
  1382.  
  1383. # Coverage tests for TclDeleteFilesCommand()
  1384. test fCmd-16.1 { test the -- argument } {
  1385.     catch {file delete -force -- tfa}
  1386.     createfile tfa
  1387.     file delete -- tfa
  1388.     file exists tfa
  1389. } {0}
  1390.  
  1391. test fCmd-16.2 { test the -force and -- arguments } {
  1392.     catch {file delete -force -- tfa}
  1393.     createfile tfa
  1394.     file delete -force -- tfa
  1395.     file exists tfa
  1396. } {0}
  1397.  
  1398. test fCmd-16.3 { test bad option } {
  1399.     catch {file delete -force -- tfa}
  1400.     createfile tfa
  1401.     set result [catch {file delete -dog tfa}]
  1402.     file delete tfa
  1403.     set result
  1404. } {1}
  1405.  
  1406. test fCmd-16.4 { test not enough args } {
  1407.     catch {file delete}
  1408. } {1}
  1409.  
  1410. test fCmd-16.5 { test not enough args with options } {
  1411.     catch {file delete --}
  1412. } {1}
  1413.  
  1414. test fCmd-16.6 {delete: source filename translation failing} {
  1415.     global env
  1416.     set temp $env(HOME)
  1417.     unset env(HOME)
  1418.     set result [catch {file delete ~/tfa}]
  1419.     set env(HOME) $temp
  1420.     set result
  1421. } {1}
  1422.  
  1423. test fCmd-16.7 {remove a non-empty directory without -force } {
  1424.     catch {file delete -force -- tfa}
  1425.     file mkdir tfa
  1426.     createfile tfa/a
  1427.     set result [catch  {file delete tfa }]
  1428.     file delete -force tfa
  1429.     set result
  1430. } {1}
  1431.  
  1432. test fCmd-16.8 {remove a normal file } {
  1433.     catch {file delete -force -- tfa}
  1434.     file mkdir tfa
  1435.     createfile tfa/a
  1436.     set result [catch  {file delete tfa }]
  1437.     file delete -force tfa
  1438.     set result
  1439. } {1}
  1440.  
  1441. test fCmd-16.9 {error while deleting file } {unixOnly} {
  1442.     catch {file delete -force -- tfa}
  1443.     file mkdir tfa
  1444.     createfile tfa/a
  1445.     exec chmod 555 tfa
  1446.     set result [catch  {file delete tfa/a }]
  1447.     #######
  1448.     #######  If any directory in a tree that is being removed does not 
  1449.     #######  have write permission, the process will fail!
  1450.     #######  This is also the case with "rm -rf"
  1451.     #######
  1452.     exec chmod 777 tfa
  1453.     file delete -force tfa
  1454.     set result
  1455. } {1}
  1456.  
  1457. test fCmd-16.10 {deleting multiple files } {
  1458.     catch {file delete -force -- tfa1 tfa2}
  1459.     createfile tfa1
  1460.     createfile tfa2
  1461.     file delete tfa1 tfa2
  1462.     expr ![file exists tfa1] && ![file exists tfa2]
  1463. } {1}
  1464.  
  1465. test fCmd-16.11 { TclFileDeleteCmd: removing a nonexistant file} {
  1466.     catch {file delete -force -- tfa}
  1467.     file delete tfa
  1468.     set result 1
  1469. } {1}
  1470.  
  1471. # More coverage tests for mkpath()
  1472.  test fCmd-17.1 {mkdir stat failing on target but not ENOENT } {unixOnly} {
  1473.      catch {file delete -force -- tfa1}
  1474.      file mkdir tfa1
  1475.      exec chmod 555 tfa1
  1476.      set result [catch {file mkdir tfa1/tfa2}]
  1477.      exec chmod 777 tfa1
  1478.      file delete -force tfa1
  1479.      set result
  1480. } {1}
  1481.  
  1482. test fCmd-17.2 {mkdir several levels deep - relative } {
  1483.     catch {file delete -force -- tfa}
  1484.     file mkdir tfa/a/b
  1485.     set result [file isdir tfa/a/b ]
  1486.     file delete tfa/a/b tfa/a tfa
  1487.     set result
  1488. } {1}
  1489.  
  1490. test fCmd-17.3 {mkdir several levels deep - absolute } {
  1491.     catch {file delete -force -- tfa}
  1492.     set f [file join [pwd] tfa a ]
  1493.     file mkdir $f
  1494.     set result [file isdir $f ]
  1495.     file delete $f [file join [pwd] tfa]
  1496.     set result
  1497. } {1}
  1498.  
  1499. #
  1500. # Functionality tests for TclFileRenameCmd()
  1501. #
  1502.  
  1503. test fCmd-18.1 {TclFileRenameCmd: rename (first form) in the same directory} {
  1504.     catch {file delete -force -- tfad}
  1505.     file mkdir tfad/dir
  1506.     cd tfad/dir
  1507.     set s [createfile foo ]
  1508.     file rename  foo bar
  1509.     file rename bar ./foo
  1510.     file rename ./foo bar
  1511.     file rename ./bar ./foo
  1512.     file rename foo ../dir/bar
  1513.     file rename ../dir/bar ./foo
  1514.     file rename ../../tfad/dir/foo ../../tfad/dir/bar
  1515.     file rename [file join [pwd] bar] foo
  1516.     file rename foo [file join [pwd] bar]
  1517.     set result [expr [checkcontent bar $s] && ![file exists foo]]
  1518.     cd ../..
  1519.     file delete -force tfad
  1520.     set result
  1521. } {1}
  1522.  
  1523. test fCmd-18.2 {TclFileRenameCmd: single dir to nonexistant } {
  1524.     catch {file delete -force -- tfa1 tfa2}
  1525.     file mkdir tfa1
  1526.     file rename tfa1 tfa2
  1527.     set result [expr [file exists tfa2] && ![file exists tfa1]]
  1528.     file delete tfa2
  1529.     set result
  1530. } {1}
  1531.  
  1532. test fCmd-18.3 {TclFileRenameCmd: mixed dirs and files into directory  } {
  1533.     catch {file delete -force -- tfa1 tfad1 tfad2}
  1534.     set s [createfile tfa1 ]
  1535.     file mkdir tfad1 tfad2
  1536.     file rename tfa1 tfad1 tfad2
  1537.     set r1 [checkcontent  tfad2/tfa1 $s]
  1538.     set r2 [file isdir tfad2/tfad1]
  1539.     set result [expr $r1 && $r2 && ![file exists tfa1] && ![file exists tfad1]]
  1540.     file delete tfad2/tfa1
  1541.     file delete -force tfad2
  1542.     set result
  1543. } {1}
  1544.  
  1545. test fCmd-18.4 {TclFileRenameCmd: attempt to replace non-dir with dir } {
  1546.     catch {file delete -force -- tfa tfad}
  1547.     set s [createfile tfa ]
  1548.     file mkdir tfad
  1549.     set r1 [catch {file rename tfad tfa}]
  1550.     set r2 [checkcontent tfa $s]
  1551.     set r3 [file isdir tfad]
  1552.     set result [expr $r1 && $r2 && $r3 ]
  1553.     file delete tfa tfad
  1554.     set result
  1555. } {1}
  1556.  
  1557. test fCmd-18.5 {TclFileRenameCmd: attempt to replace dir with non-dir } {
  1558.     catch {file delete -force -- tfa tfad}
  1559.     set s [createfile tfa ]
  1560.     file mkdir tfad/tfa
  1561.     set r1 [catch {file rename tfa tfad}]
  1562.     set r2 [checkcontent tfa $s]
  1563.     set r3 [file isdir tfad/tfa]
  1564.     set result [expr $r1 && $r2 && $r3 ]
  1565.     file delete -force  tfa tfad
  1566.     set result
  1567. } {1}
  1568.  
  1569. #
  1570. # On Windows there is no easy way to determine if two files are the same
  1571. #
  1572. test fCmd-18.6 {TclFileRenameCmd: rename a file to itself} {macOrUnix}  {
  1573.     catch {file delete -force -- tfa}
  1574.     set s [createfile tfa]
  1575.     set r1 [catch {file rename tfa tfa}]
  1576.     set result [expr $r1 && [checkcontent tfa $s]]
  1577.     file delete tfa
  1578.     set result
  1579. } {1}
  1580.  
  1581. test fCmd-18.7 {TclFileRenameCmd: rename dir on top of another empty dir w/o -force} {
  1582.     catch {file delete -force -- tfa tfad}
  1583.     file mkdir tfa tfad/tfa
  1584.     set r1 [catch {file rename tfa tfad}]
  1585.     set result [expr $r1 && [file isdir tfa]]
  1586.     file delete -force tfa tfad
  1587.     set result
  1588. } {1}
  1589.  
  1590. test fCmd-18.8 {TclFileRenameCmd: rename dir on top of another empty dir w/ -force} {
  1591.     catch {file delete -force -- tfa tfad}
  1592.     file mkdir tfa tfad/tfa
  1593.     file rename -force tfa tfad
  1594.     set result [expr ![file isdir tfa]]
  1595.     file delete -force tfad
  1596.     set result
  1597. } {1}
  1598.  
  1599. test fCmd-18.9 {TclFileRenameCmd: rename dir on top of a non-empty dir w/o -force} {
  1600.     catch {file delete -force -- tfa tfad}
  1601.     file mkdir tfa tfad/tfa/file
  1602.     set r1 [catch {file rename tfa tfad}]
  1603.     set result [expr $r1 && [file isdir tfa] && [file isdir tfad/tfa/file]]
  1604.     file delete -force tfa tfad
  1605.     set result
  1606. } {1}
  1607.  
  1608. test fCmd-18.10 {TclFileRenameCmd: rename dir on top of a non-empty dir w/ -force} {
  1609.     catch {file delete -force -- tfa tfad}
  1610.     file mkdir tfa tfad/tfa/file
  1611.     set r1 [catch {file rename -force tfa tfad}]
  1612.     set result [expr $r1 && [file isdir tfa] && [file isdir tfad/tfa/file]]
  1613.     file delete -force tfa tfad
  1614.     set result
  1615. } {1}
  1616.  
  1617. test fCmd-18.11 {TclFileRenameCmd: rename a non-existant file} {
  1618.     catch {file delete -force -- tfa1}
  1619.     set r1 [catch {file rename tfa1 tfa2}]
  1620.     set result [expr $r1 && ![file exists tfa1] && ![file exists tfa2]]
  1621. } {1}
  1622.  
  1623. test fCmd-18.12 {TclFileRenameCmd : rename a symbolic link to file} {unixOnly} {
  1624.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1625.     
  1626.     set s [createfile tfa1]
  1627.     exec ln -s tfa1 tfa2
  1628.     file rename tfa2 tfa3
  1629.     set t [file type tfa3]
  1630.     set result [expr { $t == "link" }]
  1631.     file delete tfa1 tfa3
  1632.     set result
  1633. } {1}
  1634.  
  1635. test fCmd-18.13 {TclFileRenameCmd : rename a symbolic link to dir} {unixOnly} {
  1636.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1637.     
  1638.     file mkdir tfa1
  1639.     exec ln -s tfa1 tfa2
  1640.     file rename tfa2 tfa3
  1641.     set t [file type tfa3]
  1642.     set result [expr { $t == "link" }]
  1643.     file delete tfa1 tfa3
  1644.     set result
  1645. } {1}
  1646.  
  1647. test fCmd-18.14 {TclFileRenameCmd : rename a path with sym link} {unixOnly} {
  1648.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1649.     
  1650.     file mkdir tfa1/a/b/c/d
  1651.     file mkdir tfa2
  1652.     set f [file join [pwd] tfa1/a/b] 
  1653.     set f2 [file join [pwd] {tfa2/b alias}]
  1654.     exec ln -s $f $f2
  1655.     file rename {tfa2/b alias/c} tfa3
  1656.     set r1 [file isdir tfa3]
  1657.     set r2 [file exists tfa1/a/b/c]
  1658.     set result [expr $r1 && !$r2]
  1659.     file delete -force tfa1 tfa2 tfa3
  1660.     set result
  1661. } {1}
  1662.  
  1663. test fCmd-18.15 {TclFileRenameCmd : rename a file to a symlink dir} {unixOnly} {
  1664.     catch {file delete -force -- tfa1 tfa2 tfalink}
  1665.     
  1666.     file mkdir tfa1
  1667.     set s [createfile tfa2]
  1668.     exec ln -s tfa1 tfalink
  1669.  
  1670.     file rename tfa2 tfalink
  1671.     set result [checkcontent tfa1/tfa2 $s ]
  1672.     file delete -force tfa1 tfalink
  1673.     set result
  1674. } {1}
  1675.  
  1676. test fCmd-18.16 {TclFileRenameCmd : rename a dangling symlink} {unixOnly} {
  1677.     catch {file delete -force -- tfa1 tfalink}
  1678.     
  1679.     file mkdir tfa1
  1680.     exec ln -s tfa1 tfalink
  1681.     file delete tfa1 
  1682.     file rename tfalink tfa2
  1683.     set result [expr [string compare [file type tfa2] "link"] == 0]
  1684.     file delete tfa2
  1685.     set result
  1686. } {1}
  1687.  
  1688.  
  1689. #
  1690. # Coverage tests for TclUnixRmdir
  1691. #
  1692. test fCmd-19.1 { remove empty directory } {
  1693.     catch {file delete -force -- tfa}
  1694.     file mkdir tfa
  1695.     file delete tfa
  1696.     file exists tfa
  1697. } {0}
  1698.  
  1699. test fCmd-19.2 { rmdir error besides EEXIST} {unixOnly} {
  1700.     catch {file delete -force -- tfa}
  1701.     file mkdir tfa
  1702.     file mkdir tfa/a
  1703.     exec chmod 555 tfa
  1704.     set result [catch {file delete tfa/a}]
  1705.     exec chmod 777 tfa
  1706.     file delete -force tfa
  1707.     set result
  1708. } {1}
  1709.  
  1710. test fCmd-19.3 { recursive remove } {
  1711.     catch {file delete -force -- tfa}
  1712.     file mkdir tfa
  1713.     file mkdir tfa/a
  1714.     file delete -force tfa
  1715.     file exists tfa
  1716. } {0}
  1717.  
  1718. #
  1719. # TclUnixDeleteFile and TraversalDelete are covered by tests from the 
  1720. # TclDeleteFilesCmd suite
  1721. #
  1722. #
  1723.  
  1724. #
  1725. # Coverage tests for TraverseUnixTree(), called from TclDeleteFilesCmd
  1726. #
  1727.  
  1728. test fCmd-20.1 {TraverseUnixTree : failure opening a subdirectory directory } {unixOnly} {
  1729.     catch {file delete -force -- tfa}
  1730.     file mkdir tfa
  1731.     file mkdir tfa/a
  1732.     exec chmod 000 tfa/a
  1733.     set result [catch {file delete -force tfa}]
  1734.     exec chmod 777 tfa/a
  1735.     file delete -force tfa
  1736.     set result
  1737. } {1}
  1738.  
  1739.  
  1740. #
  1741. # Feature testing for TclCopyFilesCmd
  1742. test fCmd-21.1 {copy : single file to nonexistant } {
  1743.     catch {file delete -force -- tfa1 tfa2}
  1744.     set s [createfile tfa1]
  1745.     file copy tfa1 tfa2
  1746.     set result [expr [checkcontent tfa2 $s] && [checkcontent tfa1 $s]]
  1747.     file delete tfa1 tfa2
  1748.     set result
  1749. } {1}
  1750.  
  1751. test fCmd-21.2 {copy : single dir to nonexistant } {
  1752.     catch {file delete -force -- tfa1 tfa2}
  1753.     file mkdir tfa1
  1754.     file copy tfa1 tfa2
  1755.     set result [expr [file isdir tfa2] && [file isdir tfa1]]
  1756.     file delete tfa1 tfa2
  1757.     set result
  1758. } {1}
  1759.  
  1760. test fCmd-21.3 {copy : single file into directory  } {
  1761.     catch {file delete -force -- tfa1 tfad}
  1762.     set s [createfile tfa1]
  1763.     file mkdir tfad
  1764.     file copy tfa1 tfad
  1765.     set result [expr [checkcontent tfad/tfa1 $s] && [checkcontent tfa1 $s]]
  1766.     file delete -force tfa1 tfad
  1767.     set result
  1768. } {1}
  1769.  
  1770. test fCmd-21.4 {copy : more than one source and target is not a directory} {
  1771.     catch {file delete -force -- tfa1 tfa2 tfa3}
  1772.     createfile tfa1 
  1773.     createfile tfa2 
  1774.     createfile tfa3 
  1775.     set result [catch {file copy tfa1 tfa2 tfa3}]
  1776.     file delete tfa1 tfa2 tfa3
  1777.     set result
  1778. } {1}
  1779.  
  1780. test fCmd-21.5 {copy : multiple files into directory  } {
  1781.     catch {file delete -force -- tfa1 tfa2 tfad}
  1782.     set s1 [createfile tfa1 ]
  1783.     set s2 [createfile tfa2 ]
  1784.     file mkdir tfad
  1785.     file copy tfa1 tfa2 tfad
  1786.     set r1 [checkcontent tfad/tfa1 $s1]
  1787.     set r2 [checkcontent tfad/tfa2 $s2]
  1788.     set r3 [checkcontent tfa1 $s1]
  1789.     set r4 [checkcontent tfa2 $s2]
  1790.     set result [expr $r1 && $r2 && $r3 && $r4]
  1791.     file delete -force tfa1 tfa2 tfad
  1792.     set result
  1793. } {1}
  1794.  
  1795. test fCmd-21.6 {copy : mixed dirs and files into directory  } {notFileSharing} {
  1796.     catch {file delete -force -- tfa1 tfad1 tfad2}
  1797.     set s [createfile tfa1 ]
  1798.     file mkdir tfad1 tfad2
  1799.     file copy tfa1 tfad1 tfad2
  1800.     set r1 [checkcontent [file join tfad2 tfa1] $s]
  1801.     set r2 [file isdir [file join tfad2 tfad1]]
  1802.     set r3 [checkcontent tfa1 $s]
  1803.     set result [expr $r1 && $r2 && $r3 && [file isdir tfad1]]
  1804.     file delete -force tfa1 tfad1 tfad2
  1805.     set result
  1806. } {1}
  1807.  
  1808. test fCmd-21.7 {TclCopyFilesCmd : copy a dangling link } {unixOnly} {
  1809.     file mkdir tfad1
  1810.     exec ln -s tfad1 tfalink
  1811.     file delete tfad1
  1812.     file copy tfalink tfalink2
  1813.     set result [string match [file type tfalink2] link]
  1814.     file delete tfalink tfalink2 
  1815.     set result
  1816. } {1}
  1817.  
  1818. test fCmd-21.8 {TclCopyFilesCmd : copy a link } {unixOnly} {
  1819.     file mkdir tfad1
  1820.     exec ln -s tfad1 tfalink
  1821.     file copy tfalink tfalink2
  1822.     set r1 [file type tfalink]
  1823.     set r2 [file type tfalink2]
  1824.     set r3 [file isdir tfad1]
  1825.     set result [expr {("$r1" == "link" ) && ("$r2" == "link" ) && $r3}]
  1826.     file delete tfad1 tfalink tfalink2
  1827.     set result
  1828. } {1}
  1829.  
  1830. test fCmd-21.9 {TclCopyFilesCmd : copy dir with a link in it } {unixOnly} {
  1831.     file mkdir tfad1
  1832.     exec ln -s "[pwd]/tfad1" tfad1/tfalink
  1833.     file copy tfad1 tfad2
  1834.     set result [string match [file type tfad2/tfalink] link]
  1835.     file delete -force tfad1 tfad2
  1836.     set result
  1837. } {1}
  1838.  
  1839. test fCmd-21.10 {TclFileCopyCmd: copy dir on top of another empty dir w/o -force} {
  1840.     catch {file delete -force -- tfa tfad}
  1841.     file mkdir tfa [file join tfad tfa]
  1842.     set r1 [catch {file copy tfa tfad}]
  1843.     set result [expr $r1 && [file isdir tfa]]
  1844.     file delete -force tfa tfad
  1845.     set result
  1846. } {1}
  1847.  
  1848. test fCmd-21.11 {TclFileCopyCmd: copy dir on top of a dir w/o -force} {
  1849.     catch {file delete -force -- tfa tfad}
  1850.     file mkdir tfa [file join tfad tfa file]
  1851.     set r1 [catch {file copy tfa tfad}]
  1852.     set result [expr $r1 && [file isdir tfa] && [file isdir [file join tfad tfa file]]]
  1853.     file delete -force tfa tfad
  1854.     set result
  1855. } {1}
  1856.  
  1857. test fCmd-21.12 {TclFileCopyCmd: copy dir on top of a non-empty dir w/ -force} {
  1858.     catch {file delete -force -- tfa tfad}
  1859.     file mkdir tfa [file join tfad tfa file]
  1860.     set r1 [catch {file copy -force tfa tfad}]
  1861.     set result [expr $r1 && [file isdir tfa] && [file isdir [file join tfad tfa file]]]
  1862.     file delete -force tfa tfad
  1863.     set result
  1864. } {1}
  1865.    
  1866. #
  1867. # Coverage testing for TclpRenameFile
  1868. #
  1869. test fCmd-22.1 { TclpRenameFile : rename and overwrite in a single dir } {
  1870.     catch {file delete -force -- tfa1 tfa2}
  1871.     set s [createfile tfa1]
  1872.     set s2 [createfile tfa2 q]
  1873.     
  1874.     set r1 [catch {rename tfa1 tfa2}]
  1875.     file rename -force tfa1 tfa2
  1876.     set result [expr $r1 && [checkcontent tfa2 $s]]
  1877.     file delete [glob tfa1 tfa2]
  1878.     set result
  1879. } {1}
  1880.  
  1881. test fCmd-22.2 { TclpRenameFile : attempt to overwrite itself } {macOrUnix} {
  1882.     catch {file delete -force -- tfa1}
  1883.     set s [createfile tfa1]    
  1884.     file rename -force tfa1 tfa1
  1885.     set result [checkcontent tfa1 $s]
  1886.     file delete tfa1 
  1887.     set result
  1888. } {1}
  1889.  
  1890. test fCmd-22.3 { TclpRenameFile : rename dir to existing dir } {
  1891.     catch {file delete -force -- d1 tfad}
  1892.     file mkdir d1 [file join tfad d1]
  1893.     set r1 [catch {file rename d1 tfad}]
  1894.     set result [expr $r1 && [file isdir d1] && [file isdir [file join tfad d1]]]
  1895.     file delete -force d1 tfad
  1896.     set result
  1897. } {1}
  1898.  
  1899. test fCmd-22.4 { TclpRenameFile : rename dir to dir several levels deep } {
  1900.     catch {file delete -force -- d1 tfad}
  1901.     file mkdir d1 [file join tfad a b c]
  1902.     file rename d1 [file join tfad a b c d1]
  1903.     set result [expr ![file isdir d1] && [file isdir [file join tfad a b c d1]]]
  1904.     file delete -force [glob d1 tfad]
  1905.     set result
  1906. } {1}
  1907.  
  1908.  
  1909. #
  1910. # TclMacCopyFile needs to be redone.
  1911. #
  1912. test fCmd-22.5 { TclMacCopyFile : copy and overwrite in a single dir } {
  1913.     catch {file delete -force -- tfa1 tfa2}
  1914.     set s [createfile tfa1]
  1915.     set s2 [createfile tfa2 q]
  1916.  
  1917.     set r1 [catch {file copy tfa1 tfa2}]
  1918.     file copy -force tfa1 tfa2
  1919.     set result [expr $r1 && [checkcontent tfa2 $s] && [checkcontent tfa1 $s]]
  1920.     file delete tfa1 tfa2
  1921.     set result
  1922. } {1}
  1923.  
  1924. #
  1925. # TclMacMkdir - basic cases are covered elsewhere.
  1926. # Error cases are not covered.
  1927. #
  1928.  
  1929. #
  1930. # TclMacRmdir
  1931. # Error cases are not covered.
  1932. #
  1933.  
  1934. test fCmd-23.1 { TclMacRmdir : trying to remove a nonempty directory } {
  1935.     catch {file delete -force -- tfad}
  1936.     
  1937.     file mkdir [file join tfad dir]
  1938.     
  1939.     set result [catch {file delete tfad}]
  1940.     file delete -force tfad 
  1941.     set result
  1942. } {1}
  1943.  
  1944. #
  1945. # TclMacDeleteFile    
  1946. # Error cases are not covered.
  1947. #
  1948. test fCmd-24.1 { TclMacDeleteFile : deleting a normal file } {
  1949.     catch {file delete -force -- tfa1}
  1950.     
  1951.     createfile tfa1
  1952.     file delete tfa1
  1953.     file exists tfa1
  1954. } {0}
  1955.  
  1956. #
  1957. # TclMacCopyDirectory
  1958. # Error cases are not covered.
  1959. #
  1960. test fCmd-25.1 { TclMacCopyDirectory : copying a normal directory} {notFileSharing} {
  1961.     catch {file delete -force -- tfad1 tfad2}
  1962.         
  1963.     file mkdir [file join tfad1 a b c]
  1964.     file copy tfad1 tfad2
  1965.     set result [expr [file isdir [file join tfad1 a b c]] && [file isdir [file join tfad2 a b c]]]
  1966.     file delete -force tfad1 tfad2
  1967.     set result
  1968. } {1}
  1969.  
  1970. test fCmd-25.2 { TclMacCopyDirectory : copying a short path normal directory} {notFileSharing} {
  1971.     catch {file delete -force -- tfad1 tfad2}
  1972.         
  1973.     file mkdir tfad1
  1974.     file copy tfad1 tfad2
  1975.     set result [expr [file isdir tfad1] && [file isdir tfad2]]
  1976.     file delete tfad1 tfad2
  1977.     set result
  1978. } {1}
  1979.  
  1980. test fCmd-25.3 { TclMacCopyDirectory : copying dirs between different dirs} {notFileSharing} {
  1981.     catch {file delete -force -- tfad1 tfad2}
  1982.         
  1983.     file mkdir [file join tfad1 x y z]
  1984.     file mkdir [file join tfad2 dir]
  1985.     file copy tfad1 [file join tfad2 dir]
  1986.     set result [expr [file isdir [file join tfad1 x y z]] && [file isdir [file join tfad2 dir tfad1 x y z]]]
  1987.     file delete -force tfad1 tfad2
  1988.     set result
  1989. } {1}
  1990.  
  1991. #
  1992. # Functionality tests for TclDeleteFilesCmd
  1993. #
  1994.  
  1995. test fCmd-26.1 { TclDeleteFilesCmd : delete symlink} {unixOnly} {
  1996.     catch {file delete -force -- tfad1 tfad2}
  1997.         
  1998.     file mkdir tfad1
  1999.     exec ln -s tfad1 tfalink
  2000.     file delete tfalink
  2001.  
  2002.     set r1 [file isdir tfad1]
  2003.     set r2 [file exists tfalink]
  2004.     
  2005.     set result [expr $r1 && !$r2]
  2006.     file delete tfad1
  2007.     set result
  2008. } {1}
  2009.  
  2010. test fCmd-26.2 { TclDeleteFilesCmd : delete dir with symlink} {unixOnly} {
  2011.     catch {file delete -force -- tfad1 tfad2}
  2012.         
  2013.     file mkdir tfad1
  2014.     file mkdir tfad2
  2015.     exec ln -s tfad1 [file join tfad2 link]
  2016.     file delete -force tfad2
  2017.  
  2018.     set r1 [file isdir tfad1]
  2019.     set r2 [file exists tfad2]
  2020.     
  2021.     set result [expr $r1 && !$r2]
  2022.     file delete tfad1
  2023.     set result
  2024. } {1}
  2025.  
  2026. test fCmd-26.3 { TclDeleteFilesCmd : delete dangling symlink} {unixOnly} {
  2027.     catch {file delete -force -- tfad1 tfad2}
  2028.         
  2029.     file mkdir tfad1
  2030.     exec ln -s tfad1 tfad2
  2031.     file delete tfad1
  2032.     file delete tfad2
  2033.  
  2034.     set r1 [file exists tfad1]
  2035.     set r2 [file exists tfad2]
  2036.     
  2037.     set result [expr !$r1 && !$r2]
  2038.     set result
  2039. } {1}
  2040.  
  2041. test fCmd-27.1 {TclFileAttrsCmd - wrong # args} {
  2042.     list [catch {file attributes a b c d} msg] $msg
  2043. } {1 {wrong # args: must be "file attributes name ?option? ?value? ?option value? ..."}}
  2044. test fCmd-27.2 {TclFileAttrsCmd - Tcl_TranslateFileName fails} {
  2045.     testsetplatform unix
  2046.     list [catch {file attributes ~_bad_user} msg] $msg [testsetplatform $platform]
  2047. } {1 {user "_bad_user" doesn't exist} {}}
  2048. test fCmd-27.3 {TclFileAttrsCmd - all attributes} {
  2049.     catch {file delete -force -- foo.tmp}
  2050.     createfile foo.tmp
  2051.     list [catch {file attributes foo.tmp} msg] [expr {[llength $msg] > 0}] [file delete -force -- foo.tmp]
  2052. } {0 1 {}}
  2053. test fCmd-27.4 {TclFileAttrsCmd - getting one option} {
  2054.     catch {file delete -force -- foo.tmp}
  2055.     createfile foo.tmp
  2056.     set attrs [file attributes foo.tmp]
  2057.     list [catch {eval file attributes foo.tmp [lindex $attrs 0]}] [file delete -force -- foo.tmp]
  2058. } {0 {}}
  2059.  
  2060. set testConfig(tclGroup) 0
  2061. if {($tcl_platform(platform) == "macintosh") \
  2062.     || ($tcl_platform(platform) == "windows")} {
  2063.     set testConfig(tclGroup) 1
  2064. } elseif {[catch {exec {groups}} groupList] == 0} {
  2065.     if {[lsearch $groupList tcl] != -1} {
  2066.     set testConfig(tclGroup) 1
  2067.     }
  2068. }
  2069.  
  2070. test fCmd-27.5 {TclFileAttrsCmd - setting one option} {tclGroup} {
  2071.     catch {file delete -force -- foo.tmp}
  2072.     createfile foo.tmp
  2073.     set attrs [file attributes foo.tmp]
  2074.     list [catch {eval file attributes foo.tmp [lrange $attrs 0 1]} msg] $msg [file delete -force -- foo.tmp]
  2075. } {0 {} {}}
  2076. test fCmd-27.6 {TclFileAttrsCmd - setting more than one option} {tclGroup} {
  2077.     catch {file delete -force -- foo.tmp}
  2078.     createfile foo.tmp
  2079.     set attrs [file attributes foo.tmp]
  2080.     list [catch {eval file attributes foo.tmp [lrange $attrs 0 3]} msg] $msg [file delete -force -- foo.tmp]
  2081. } {0 {} {}}
  2082.  
  2083. cleanup
  2084.